﻿
CREATE PROCEDURE [dbo].[DisgatherGoodsInsert] --разборка товара
(
	@SrcPartyId int,						--партия товара, который разукомплектовывается
	@DestGoodsId int,						--идентификатор товара, который приходуется после разукомплектации
	@FirstPrice decimal(19,2),  --первая цена 
	@FirstQntty int,						--количество по первой цене
	@SecondPrice decimal(19,2),	--вторая цена
	@SecondQntty int,						--количество по второй цене
	@Note varchar(250),
	@MW varchar(50),
	@DocId int OUTPUT						--идентификатор документа по разборке товара
)
AS
DECLARE @strMsg nvarchar(500), @intRet int, @intErrCode int, @intDocNextId int, @intLineNextId int
DECLARE @intT int, @decPrice decimal(19,2), @intInputLineId int, @strBarCode char(12)
DECLARE @intSrcGoodsId int, @intChildGoodsId int, @DocNumber varchar(20), @MD datetime
DECLARE @DepartmentUserId int, @bitBlocked bit, @bitAllowUnPack bit

SET NOCOUNT ON

IF (@SrcPartyId Is Null) OR (@DestGoodsId Is Null) OR (@FirstPrice Is Null) OR (@FirstQntty Is Null)
BEGIN
	SELECT @intErrCode = 1, @strMsg = 'Неправильные параметры в вызове процедуры ' + Object_Name(@@Procid) + ' !'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

--определение цены разбираемого товара TODO чтобы партия была создана раньше чем текущее дата/время
SELECT @decPrice = RetailPrice, @intInputLineId = InputLineId, @intSrcGoodsId = GoodsId, 
@intT = RestQntty, @bitBlocked = Blocked, @strBarCode = BarCode
FROM CD.Parties WHERE Id = @SrcPartyId
IF (@@rowcount <> 1 )
BEGIN
	SELECT @intErrCode = 2, 
	@strMsg = 'Не найдена партия ' + @strBarCode + '(' + cast(@SrcPartyId as varchar(20)) + ') !'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

IF (@intT < 1)
BEGIN
	SELECT @intErrCode = 3, 
	@strMsg = 'Текущие остатки по партии ' + @strBarCode + '(' + cast(@SrcPartyId as varchar(20)) + ') меньше 1!'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

IF (@bitBlocked = 1)
BEGIN
	SELECT @intErrCode = 4, 
	@strMsg = 'Партии ' + @strBarCode + '(' + cast(@SrcPartyId as varchar(20)) + ') заблокирована!'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

IF (@FirstPrice <= 0) OR (@FirstQntty <= 0) 
BEGIN
	SELECT @intErrCode = 5, 
	@strMsg = 'Цена и количество 1 д.б. больше нуля !'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

SELECT @intChildGoodsId = ChildId FROM CA.Goods WHERE Id = @intSrcGoodsId
IF (@intChildGoodsId <> @DestGoodsId) OR (@intChildGoodsId Is Null)
BEGIN
	SELECT @intErrCode = 6, 
	@strMsg = 'Разбираемый товар не имеет указанного потомка!'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

IF @decPrice <= @FirstPrice 
BEGIN
	SELECT @intErrCode = 7, 
	@strMsg = 'Цена 1 разобранного товара д.б. меньше цены разбираемого товара!'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

IF (@SecondPrice Is NOT Null) AND (@decPrice <= @SecondPrice )
BEGIN
	SELECT @intErrCode = 8, 
	@strMsg = 'Цена 2 разобранного товара д.б. меньше цены разбираемого товара!'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

SELECT @bitAllowUnPack = AllowUnPack FROM CA.Goods WHERE Id = @intSrcGoodsId

IF (@bitAllowUnPack <> 1)
BEGIN
	SELECT @intErrCode = 9, 
	@strMsg = 'Товар с идентификатором ' + cast(@intSrcGoodsId as varchar(10)) + ' запрещено разукомплектовывать!'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

EXEC [dbo].[ProcessStatistic] @Note OUTPUT, @MD OUTPUT, @MW OUTPUT

EXEC [dbo].[GetNextBarCode]	@strBarCode OUTPUT

IF @DocNumber Is Null
BEGIN
	exec [dbo].[GetNextDocNumber] 12, @intRet OUT
	SET @DocNumber = cast( @intRet as varchar(20))
END

SELECT @DepartmentUserId = Id FROM CD.DepartmentUsers WHERE Login = suser_sname()
--получение значения идентификатора документа
EXEC @intRet = dbo.GetNextCounterFor 'Documents', @intDocNextId OUTPUT
IF @intRet <> 0 RETURN @intRet
--получение значения идентификатора строки документа
EXEC @intRet = dbo.GetNextCounterFor 'GoodsLines', @intLineNextId OUTPUT
IF @intRet <> 0 RETURN @intRet

BEGIN TRAN
--Создание документа на разборку товара
--в поле ContragentDocNumber записывается штрих-код для первой партии
INSERT INTO [CA].[Documents] 
(Id, [DocTypeId], [DocDate], [DocNumber], [ContragentId], DepartmentUserId, ContragentDocNumber, Note, [MD], [MW]) 
VALUES (@intDocNextId, 12, dbo.TodayDate(), @DocNumber, 0, @DepartmentUserId, @strBarCode, @Note, @MD, @MW);

--списание одной единицы из исходной партии
INSERT INTO [CA].[GoodsDocLines]
(Id, DocId, PartyId, [Qntty], [RetailSum], [MD],[MW])
VALUES(@intLineNextId, @intDocNextId, @SrcPartyId, -1, @decPrice * -1.0, @MD, @MW)


EXEC @intRet = dbo.GetNextCounterFor 'GoodsLines', @intLineNextId OUTPUT
IF @intRet <> 0 
BEGIN
	IF @@trancount > 0 ROLLBACK TRAN
	RETURN @intRet
END

--создание новой партии по первой цене
INSERT INTO CD.Parties 
(Id, [DocId], [GoodsId], [BarCode], [RetailPrice], InputLineId, Blocked, [MD], [MW])
VALUES (@intLineNextId, @intDocNextId, @DestGoodsId, @strBarCode, @FirstPrice, @intInputLineId, 0, @MD, @MW)


--создание проводки по новой партии
INSERT INTO [CA].[GoodsDocLines]
(Id, DocId, PartyId, [Qntty], [RetailSum],[MD],[MW])
VALUES(@intLineNextId, @intDocNextId, @intLineNextId, @FirstQntty, @FirstPrice * @FirstQntty , @MD, @MW)


IF (@SecondPrice Is NOT Null) AND (@SecondQntty Is NOT Null)
BEGIN
--Изменил Евгений Веприков
--При нулевом количестве и цене просто выходим
	IF (@SecondPrice = 0) AND (@SecondQntty = 0)
	BEGIN
		COMMIT TRAN			
		RETURN 0
	END
-------------------------------------------------------------------------
	IF (@SecondPrice <= 0) OR (@SecondQntty <= 0) 
	BEGIN
		IF @@trancount > 0 ROLLBACK TRAN
		SELECT @intErrCode = 8, 
		@strMsg = 'Цена и количество 2 д.б. больше нуля !'
		RAISERROR (@strMsg, 11, @intErrCode)
		RETURN 
	END

	EXEC [dbo].[GetNextBarCode]	@strBarCode OUTPUT
--получение значения идентификатора строки документа
	EXEC @intRet = dbo.GetNextCounterFor 'GoodsLines', @intLineNextId OUTPUT
	IF @intRet <> 0 
	BEGIN
		IF @@trancount > 0 ROLLBACK TRAN
		RETURN @intRet
	END

--создание новой партии по второй цене
	INSERT INTO CD.Parties 
	(Id, [DocId], [GoodsId], [BarCode], [RetailPrice], InputLineId, Blocked, [MD], [MW])
	VALUES (@intLineNextId, @intDocNextId, @DestGoodsId, @strBarCode, @SecondPrice, @intInputLineId, 0, @MD, @MW)

	INSERT INTO [CA].[GoodsDocLines]
	(Id, DocId, PartyId, [Qntty],[RetailSum],[MD],[MW])
	VALUES(@intLineNextId, @intDocNextId, @intLineNextId, @SecondQntty, @SecondPrice * @SecondQntty , @MD, @MW)

END

COMMIT TRAN

SET @DocId = @intDocNextId

RETURN 0

